Technical Q&A QA1332
Shearing a Coordinate Space with NSAffineTransform


QÅFç¿ïWãÛä‘ÇÉVÉAÅ[ïœå`Ç∑ÇÈ NSAffineTransform ÇçsǧDžÇÕÅAÇ«ÇÃÇÊǧDžÇ∑ÇÍÇŒÇÊÇ¢Ç≈ǵÇÂǧǩÅB

AÅFÉAÉtÉBÉìïœä∑ÇégópǵǃÅAç¿ïWãÛä‘Ç…îCà”ÇÃâÒì]ÅAägëÂÅEèkè¨ÅAÉVÉAÅ[ïœå`ÇÃëgÇ›çáÇÌÇπÇìKópÇ≈Ç´Ç‹Ç∑ÅBÉAÉtÉBÉìïœä∑ÇÕêîäwìIÇ…ÇÕã…ÇflǃíPèÉÇ≈ÅAQuartz 2D ÇÃÉ}ÉjÉÖÉAÉãÇÃDZDZDžê‡ñæÇ™Ç†ÇËÇ‹Ç∑ÅB

NSAffineTransform ÉNÉâÉXÇÃÉ}ÉjÉÖÉAÉã Ç…ÇÕÅAÉVÉAÅ[ïœå`ÇÕâ¬î\ÇæÇ™ïœä∑ç\ë¢ÇÃìKêÿÇ»ílÇíºê⁄ê›íËÇ∑ÇÈïKóvǙdžÇÈÅAÇΔèëÇ©ÇÍǃǢNjÇ∑ÅBDZÇÍÇÇÊÇËä»íPÇ…é¿åªÇ∑ÇÈï˚ñ@ÇÕÅAObjective-C category ÇégópǵÅAÉNÉâÉXÇ…ÉÅÉ\ÉbÉhÇí«â¡ÇµÇƒÅAÉVÉAÅ[ïœå`ÇÃílÇê›íËÇ∑ÇÈDZÇΔÇ≈Ç∑ÅB



ÉäÉXÉg 1.NSAffineTransform_Shearing.h

#import <Cocoa/Cocoa.h>

@interface NSAffineTransform (Shearing)

- (void) shearXBy:(float) xShear yBy:(float) yShear;
- (void) shearXBy:(float) xShear;
- (void) shearYBy:(float) yShear;

@end






ÉäÉXÉg 2.NSAffineTransform_Shearing.m


@implementation NSAffineTransform (Shearing)
  
- (void) shearXBy: (float) xShear yBy: (float) yShear;
  {
  NSAffineTransform 
    *shearTransform = [[NSAffineTransform alloc] init];
    
  NSAffineTransformStruct 
    transformStruct = [shearTransform transformStruct];
    
  transformStruct.m21 = xShear;
  transformStruct.m12 = yShear;
  
  [shearTransform setTransformStruct:transformStruct];
  [self appendTransform:shearTransform];
  [shearTransform release];
  }

  // ìØéûÇ… 1 ǬÇÃé≤ÇæÇØÇÉVÉAÅ[ïœå`ǵÇΩÇ¢èÍçá...
- (void) shearXBy:(float) xShear { [self shearXBy:xShear yBy:0.0];  }
- (void) shearYBy:(float) yShear  {  [self shearXBy:0.0 yBy:yShear]; }

@end




DZÇÃéËñ@ÇégÇ¡ÇΩÉRÅ[ÉhÇÃó·ÇÕÅATransformed Image ÉTÉìÉvÉãÉRÅ[ÉhÉvÉçÉWÉFÉNÉgÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB


[2004 îN 1 åé 29 ì˙]